home *** CD-ROM | disk | FTP | other *** search
- /* macfun.c - macintosh user interface functions for xlisp */
-
- #include "xlisp.h"
- #include <mem.h>
- #include <qd.h>
-
- overlay "macstuff"
-
- /* external variables */
- extern NODE ***xlstack;
- extern GrafPtr cwindow,gwindow;
-
- /* forward declarations */
- FORWARD NODE *do_0();
- FORWARD NODE *do_1();
- FORWARD NODE *do_2();
-
- /* pow - fake power function */
- pow()
- {
- xlfail("function not available");
- }
-
- /* xhidepen - hide the pen */
- NODE *xhidepen(args)
- NODE *args;
- {
- return (do_0(args,'H'));
- }
-
- /* xshowpen - show the pen */
- NODE *xshowpen(args)
- NODE *args;
- {
- return (do_0(args,'S'));
- }
-
- /* xgetpen - get the pen position */
- NODE *xgetpen(args)
- NODE *args;
- {
- NODE ***oldstk,*val;
- Point p;
- xllastarg(args);
- SetPort(gwindow);
- GetPen(&p);
- SetPort(cwindow);
- oldstk = xlstack;
- xlsave1(val);
- val = consa(NIL);
- rplaca(val,cvfixnum((FIXNUM)p.a.h));
- rplacd(val,cvfixnum((FIXNUM)p.a.v));
- xlstack = oldstk;
- return (val);
- }
-
- /* xpenmode - set the pen mode */
- NODE *xpenmode(args)
- NODE *args;
- {
- return (do_1(args,'M'));
- }
-
- /* xpensize - set the pen size */
- NODE *xpensize(args)
- NODE *args;
- {
- return (do_2(args,'S'));
- }
-
- /* xpenpat - set the pen pattern */
- NODE *xpenpat(args)
- NODE *args;
- {
- NODE *plist;
- char pat[8],i;
- plist = xlmatch(LIST,&args);
- xllastarg(args);
- for (i = 0; i < 8 && consp(plist); ++i, plist = cdr(plist))
- if (fixp(car(plist)))
- pat[i] = car(plist)->n_int;
- SetPort(gwindow);
- PenPat(pat);
- SetPort(cwindow);
- return (NIL);
- }
-
- /* xpennormal - set the pen to normal */
- NODE *xpennormal(args)
- NODE *args;
- {
- xllastarg(args);
- SetPort(gwindow);
- PenNormal();
- SetPort(cwindow);
- return (NIL);
- }
-
- /* xmoveto - Move to a screen location */
- NODE *xmoveto(args)
- NODE *args;
- {
- return (do_2(args,'m'));
- }
-
- /* xmove - Move in a specified direction */
- NODE *xmove(args)
- NODE *args;
- {
- return (do_2(args,'M'));
- }
-
- /* xlineto - draw a Line to a screen location */
- NODE *xlineto(args)
- NODE *args;
- {
- return (do_2(args,'l'));
- }
-
- /* xline - draw a Line in a specified direction */
- NODE *xline(args)
- NODE *args;
- {
- return (do_2(args,'L'));
- }
-
- /* xshowgraphics - show the graphics window */
- NODE *xshowgraphics(args)
- NODE *args;
- {
- xllastarg(args);
- scrsplit(1);
- return (NIL);
- }
-
- /* xhidegraphics - hide the graphics window */
- NODE *xhidegraphics(args)
- NODE *args;
- {
- xllastarg(args);
- scrsplit(0);
- return (NIL);
- }
-
- /* xcleargraphics - clear the graphics window */
- NODE *xcleargraphics(args)
- NODE *args;
- {
- xllastarg(args);
- SetPort(gwindow);
- EraseRect(&gwindow->portRect);
- SetPort(cwindow);
- return (NIL);
- }
-
- /* do_0 - Handle commands that require no arguments */
- LOCAL NODE *do_0(args,fcn)
- NODE *args; int fcn;
- {
- xllastarg(args);
- SetPort(gwindow);
- switch (fcn) {
- case 'H': HidePen(); break;
- case 'S': ShowPen(); break;
- }
- SetPort(cwindow);
- return (NIL);
- }
-
- /* do_1 - Handle commands that require one integer argument */
- LOCAL NODE *do_1(args,fcn)
- NODE *args; int fcn;
- {
- int x;
- x = getnumber(&args);
- xllastarg(args);
- SetPort(gwindow);
- switch (fcn) {
- case 'M': PenMode(x); break;
- }
- SetPort(cwindow);
- return (NIL);
- }
-
- /* do_2 - Handle commands that require two integer arguments */
- LOCAL NODE *do_2(args,fcn)
- NODE *args; int fcn;
- {
- int h,v;
- h = getnumber(&args);
- v = getnumber(&args);
- xllastarg(args);
- SetPort(gwindow);
- switch (fcn) {
- case 'l': LineTo(h,v); break;
- case 'L': Line(h,v); break;
- case 'm': MoveTo(h,v); break;
- case 'M': Move(h,v); break;
- case 'S': PenSize(h,v);break;
- }
- SetPort(cwindow);
- return (NIL);
- }
-
- /* getnumber - get an integer parameter */
- LOCAL int getnumber(pargs)
- NODE **pargs;
- {
- return ((int)xlmatch(INT,pargs)->n_int);
- }
-
- /* xtool - call the toolbox */
- NODE *xtool(args)
- NODE *args;
- {
- NODE *val;
- int trap;
-
- trap = (int)xlmatch(INT,&args)->n_int;
-
- asm {
- move.l args(A6),D0
- beq L2
- L1: move.l D0,A0
- move.l 2(A0),A1
- move.w 4(A1),-(A7)
- move.l 6(A0),D0
- bne L1
- L2: lea L3,A0
- move.w trap(A6),(A0)
- L3: dc.w 0xA000
- clr.l val(A6)
- }
-
- return (val);
- }
-
- /* xtool16 - call the toolbox with a 16 bit result */
- NODE *xtool16(args)
- NODE *args;
- {
- int trap,val;
-
- trap = xlmatch(INT,&args)->n_int;
-
- asm {
- clr.w -(A7)
- move.l args(A6),D0
- beq L2
- L1: move.l D0,A0
- move.l 2(A0),A1
- move.w 4(A1),-(A7)
- move.l 6(A0),D0
- bne L1
- L2: lea L3,A0
- move.w trap(A6),(A0)
- L3: dc.w 0xA000
- move.w (A7)+,val(A6)
- }
-
- return (cvfixnum((FIXNUM)val));
- }
-
- /* xtool32 - call the toolbox with a 32 bit result */
- NODE *xtool32(args)
- NODE *args;
- {
- int trap;
- long val;
-
- trap = xlmatch(INT,&args)->n_int;
-
- asm {
- clr.l -(A7)
- move.l args(A6),D0
- beq L2
- L1: move.l D0,A0
- move.l 2(A0),A1
- move.w 4(A1),-(A7)
- move.l 6(A0),D0
- bne L1
- L2: lea L3,A0
- move.w trap(A6),(A0)
- L3: dc.w 0xA000
- move.l (A7)+,val(A6)
- }
-
- return (cvfixnum((FIXNUM)val));
- }
-
- /* xnewhandle - allocate a new handle */
- NODE *xnewhandle(args)
- NODE *args;
- {
- long size;
- size = (long)xlmatch(INT,&args)->n_int;
- xllastarg(args);
- return (cvfixnum((FIXNUM)NewHandle(size)));
- }
-
- /* xnewptr - allocate memory */
- NODE *xnewptr(args)
- NODE *args;
- {
- long size;
- size = (long)xlmatch(INT,&args)->n_int;
- xllastarg(args);
- return (cvfixnum((FIXNUM)NewPtr(size)));
- }
-
- /* xhiword - return the high order 16 bits of an integer */
- NODE *xhiword(args)
- NODE *args;
- {
- unsigned int val;
- val = (unsigned int)(xlmatch(INT,&args)->n_int >> 16);
- xllastarg(args);
- return (cvfixnum((FIXNUM)val));
- }
-
- /* xloword - return the low order 16 bits of an integer */
- NODE *xloword(args)
- NODE *args;
- {
- unsigned int val;
- val = (unsigned int)xlmatch(INT,&args)->n_int;
- xllastarg(args);
- return (cvfixnum((FIXNUM)val));
- }
-
- /* xrdnohang - get the next character in the look-ahead buffer */
- NODE *xrdnohang(args)
- NODE *args;
- {
- int ch;
- xllastarg(args);
- if ((ch = scrnextc()) == EOF)
- return (NIL);
- return (cvfixnum((FIXNUM)ch));
- }
-
- /* osfinit - initialize the macintosh functions */
- osfinit()
- {
- NODE *sym;
-
- xlsubr("HIDEPEN", SUBR, xhidepen);
- xlsubr("SHOWPEN", SUBR, xshowpen);
- xlsubr("GETPEN", SUBR, xgetpen);
- xlsubr("PENSIZE", SUBR, xpensize);
- xlsubr("PENMODE", SUBR, xpenmode);
- xlsubr("PENPAT", SUBR, xpenpat);
- xlsubr("PENNORMAL", SUBR, xpennormal);
- xlsubr("MOVETO", SUBR, xmoveto);
- xlsubr("MOVE", SUBR, xmove);
- xlsubr("LINETO", SUBR, xlineto);
- xlsubr("LINE", SUBR, xline);
- xlsubr("SHOW-GRAPHICS", SUBR, xshowgraphics);
- xlsubr("HIDE-GRAPHICS", SUBR, xhidegraphics);
- xlsubr("CLEAR-GRAPHICS", SUBR, xcleargraphics);
- xlsubr("TOOLBOX", SUBR, xtool);
- xlsubr("TOOLBOX-16", SUBR, xtool16);
- xlsubr("TOOLBOX-32", SUBR, xtool32);
- xlsubr("NEWHANDLE", SUBR, xnewhandle);
- xlsubr("NEWPTR", SUBR, xnewptr);
- xlsubr("HIWORD", SUBR, xhiword);
- xlsubr("LOWORD", SUBR, xloword);
- xlsubr("READ-CHAR-NO-HANG", SUBR, xrdnohang);
-
- /* setup globals for the window handles */
- sym = xlsenter("*COMMAND-WINDOW*");
- sym->n_symvalue = cvfixnum((FIXNUM)cwindow);
- sym = xlsenter("*GRAPHICS-WINDOW*");
- sym->n_symvalue = cvfixnum((FIXNUM)gwindow);
- }
-